package com.education;

import java.io.IOException;
import java.util.concurrent.Callable;

import org.andengine.audio.sound.Sound;
import org.andengine.audio.sound.SoundFactory;
import org.andengine.entity.sprite.AnimatedSprite;
import org.andengine.entity.sprite.Sprite;
import org.andengine.input.touch.TouchEvent;

public class letter {
	private letter _self = this;
	public int id;
	public Sprite sprite;
	public int guessPos;
	public int srcPos;
	public int idx;
	public boolean changed;
	public Sound sound,alt,currsound,alphabetSound;
	private final MainActivity mainActivity;
	public interface touchLetter
	{
		void onTouchLetter();
	}
	public letter(int letterID, final MainActivity activity, final float x, final float y){
		id = letterID;
		mainActivity = activity;
		SoundFactory.setAssetBasePath("snd/");
		sound = Alphabet.getSound(activity,id,false);
        alt = Alphabet.getSound(activity,id,true);
        alphabetSound = Alphabet.getAlphabetSound(activity, id);
		changed = false;
		currsound = sound;
		guessPos=-1;
		srcPos=-1;
		
		//создаем спрайт буквы
		sprite = new Sprite(x,y,Alphabet.mLettersTextureRegions[id],activity.getVertexBufferObjectManager()){
			@Override
			public boolean onAreaTouched(TouchEvent pSceneTouchEvent,
					float pTouchAreaLocalX, float pTouchAreaLocalY) {
				activity.onAreaTouched(_self, pSceneTouchEvent, pTouchAreaLocalX, pTouchAreaLocalY, x, y);
				return true;
			}
		};
		
		sprite.setUserData(this);
		
		// добавляем спрайт анимации смягчения
		AnimatedSprite softAnim; //добавляем на все спрайты букв анимированный спрайт смягченя и, 
		 //в зависимости от того гласная это или согласная, проводим с ним первоначальные манипуляции
		softAnim = null;
		if (this.isStrangeVovel()||this.id==9||this.id==29)//смягчающая гласная
		{
			softAnim = new AnimatedSprite((float)-85*mainActivity.scaleRatio,(float)-70*mainActivity.scaleRatio, Alphabet.mSoftAnimSVGTexture, activity.getVertexBufferObjectManager());
		} else if (this.isNormalConsonant()||this.isHardest()||this.isSoftest()){
			//если согласная то от анимации нам нужен только последний кадр и правее. Для начала его скрываем.
			softAnim = new AnimatedSprite((float)104*mainActivity.scaleRatio,(float)-70*mainActivity.scaleRatio, Alphabet.mSoftAnimSVGTexture, activity.getVertexBufferObjectManager());
			softAnim.setVisible(this.isSoftest()); //спрятали для всех кроме тех, которые всегда мягкие
			softAnim.stopAnimation(11); //перешли на последний кадр
		}
		if (softAnim!=null)
		{
			this.sprite.attachChild(softAnim);
			softAnim.setZIndex(999);//чтобы спрайт анимации наверняка был над спрайтом буквы
		}

	}
	
	public void resetAnimationSprite()
	{
		if (this.sprite.getChildCount()>0)
		{
			AnimatedSprite softAnim = (AnimatedSprite)this.sprite.getChildByIndex(0);
			if (this.isStrangeVovel()||this.id==9||this.id==29)//смягчающая гласная
			{
				softAnim.setVisible(true); 
				softAnim.stopAnimation(0);
			} else if (this.isNormalConsonant()||this.isHardest()||this.isSoftest())
			{
				softAnim.setVisible(this.isSoftest());//спрятали для всех кроме тех, которые всегда мягкие
			}
		}
	}
	
	//смена звука на альтернативный
	public void changeSound()
	{
		changeSound(0);
	}
	
	//смена звука на альтернативный
	public void changeSound(int badIndex)
	{
        if (badIndex>0)
        {
            this.currsound = Alphabet.getSound(mainActivity,this.id,false, badIndex); //1=йи, 2=ы 
            this.changed = true;
        } 
        else	     
        {
        	this.currsound = this.alt;
            this.changed = true;
        }
	}       
	
	//возврат к обычному звуку
    public void unChangeSound()
    {
    	this.currsound = this.sound;
        this.changed = false;
        resetAnimationSprite();//TODO: проверить
    }
    
    //для получения индексов букв в массиве действий 
    public static int getEngineIdx(letter ltr)
	{
//    	0	{}
//    	1	normal_c = {к, н, г, з, х, ф, в, п, р, л, д, с, м, т, б}
//    	2	normal_v= {у, ы, а, о, э}
//    	3	hardest = {ш, ж, ц}
//    	4	softest = {щ, й, ч}
//    	5	strange_v = {е,ё,ю,я}
//    	6	{и}
//    	7	{ь}
//    	8	{ъ}
    	if(ltr==null)
    	{
    		return 0;
    	}
    	if(ltr.isNormalConsonant())
    	{
    		return 1;
    	}
    	if(ltr.isNormalVovel())
    	{
    		return 2;
    	}
    	if(ltr.isHardest())
    	{
    		return 3;
    	}
    	if(ltr.isSoftest())
    	{
    		return 4; 
    	}
    	if(ltr.isStrangeVovel())
    	{
    		return 5; 
    	}
    	if(ltr.id==9)
    	{
    		return 6;  	
    	}
    	if(ltr.id==29)
    	{
    		return 7;  	
    	}
    	if(ltr.id==27)
    	{
    		return 8;  	
    	}
		return 0;
	}
    
    public boolean isNormalConsonant()
    {
    	if (Utilities.getIndexOf(this.id, Alphabet.NORMAL_CONSONANT)>-1)
    	{
    		return true;
    	}
    	return false;
    }
    
    public boolean isNormalVovel()
    {
    	if (Utilities.getIndexOf(this.id, Alphabet.NORMAL_VOWEL)>-1)
    	{
    		return true;
    	}
    	return false;
    }
    
    public boolean isStrangeVovel()
    {
    	if (Utilities.getIndexOf(this.id, Alphabet.STRANGE_VOWEL)>-1)
    	{
    		return true;
    	}
    	return false;
    }
    
    public boolean isHardest()
    {
    	if (Utilities.getIndexOf(this.id, Alphabet.HARDEST)>-1)
    	{
    		return true;
    	}
    	return false;
    }
    
    public boolean isSoftest()
    {
    	if (Utilities.getIndexOf(this.id, Alphabet.SOFTEST)>-1)
    	{
    		return true;
    	}
    	return false;
    }
   
}
